# FontForge でフォントを変更するためのスクリプトの書き方

FontForge はインタプリタを内蔵しているので、フォントを変更するためのスクリプトを書くことができます。

- スクリプト処理のチュートリアル
- スクリプトの呼び出し方
- スクリプト言語
  - 組込み変数
  - 組込み手続き
  - 例
- 「スクリプトを実行」ダイアログ
- 「スクリプト」メニュー

## スクリプトの呼び出し方

スクリプトを指定して FontForge をコマンドラインから起動したときはウィンドウは表示されず、スクリプトが終了した時にプログラムの終了となります。

>     $ fontforge -script scriptfile.pe {fontnames}

FontForge は、シェルが自動的にスクリプトを渡すようなインタプリタとして使うこともできます。 スクリプトファイルが実行可能になるように
`$ chmod +x scriptfile.pe`
として、それらのファイルの先頭の行に
`#!/usr/local/bin/fontforge`
(または、システム上で FontForge が置かれているどこか別の場所) を書き加えることにより、
`$ scriptfile.pe {fontnames}`
と打つだけでスクリプトを起動できるようになります。

FontForge に標準入力からスクリプトを読み込ませたい場合は、“-”を標準入力を表すファイル名として使用することができます。 (もし FontForge を X11 無しで作成した場合、コマンドラインに何も指定しなければ、FontForge はスクリプトを標準入力から読もうと試みます。)

また、FontForge を使用中に、`ファイル(F)`→`スクリプトを実行(X)...` メニューを用いてスクリプトを起動することもできますし、頻繁に用いるスクリプトをプリファレンスダイアログで登録してメニューから直接起動可能なように設定することもできます。

スクリプト言語により、フォント表示画面のメニューに見られる機能の多くを使用することができます。 現在のところ (将来もそうでしょうが) 全ての対象にアクセスできるわけではありません。 (もし何か欠けている機能があったら作者に知らせてください。それを追加しましょう)。 スクリプト言語は曲線からグリフを組み立てるコマンドを提供する物ではなく、グリフに対する高レベルな修正を可能にするための物です。

環境変数 `PFAEDIT_VERBOSE` が定義されている場合 (値を設定する必要はなく、定義するだけで十分です) FontForge は、スクリプトを実行するごとにその内容を標準出力に書き出します。

一般的に言って、作者はこの機能を例えばラテン文字フォントを入力としてキリル文字のグリフを含むように拡張するような作業に役立つことを思い描いています。この場合、スクリプトはこのような物になるでしょう:

- フォントのコード変換を行う。
- ラテン文字“A”への参照をキリル文字“А”に配置する
- ラテン文字“R”をキリル文字“Я”にコピーする
- “Я”を水平方向に反転する
- パスの向きを修正する
- ……等々

## スクリプト言語

スクリプトの構文は、C とシェルコマンドを混ぜ合わせた物にかなり似ています。 各ファイルは手続きに対応します。 シェルスクリプトと同様に、スクリプトファイルに渡された引数は $1, $2, …, $n という識別子で用いることができます。 $0 はスクリプトそれ自身です。 $argc は引数の個数を表します。 $argv[<式>] の形で、コマンドの引数を配列としてアクセスすることができます。

項は以下のいずれかを取ることができます。

- 変数名 (例えば“$1”や“i”や“@fontvar”や“_global”のような)
  変数のスコープは、名前の 1 文字目によって決まります。
  - ‘$’は組込み変数を示します。ユーザは‘$’で始まる変数を新しく作ることはできません。それらの一部 (全部ではありません) は、値を代入することができます。
  - ‘_’はグローバル変数を示します。これは常に利用可能です。これらは、異なるスクリプトファイル間で (または、ネストしたスクリプトファイル内で) 共通のコンテキストを格納するのに用いることができます。
  - ‘@’は、変数がフォントに固有の物であることを示します。同じフォントを参照する 2 つのスクリプトは常に同じ変数にアクセスします。
  - 英文字で始まる変数はローカル変数です。それらは現在のスクリプトファイルの中でしか意味を持ちません。ネストしたスクリプトファイルの中では同じ名前の異なる変数を使用することができます。
- 10 進, 8 進または 16 進表記の整数
- Unicode のコードポイント (プレフィクス“0u”または“0U”の後ろに 16 進数表をつないだもの)。これは Select() コマンドでのみ使うことができます。
- 実数 (“C”ロケールの書式 ― 小数点は“.”)
- 二重引用符または一重引用符で囲まれた文字列。文字列トークンは 256 バイトまでに制限されています。改行文字を表すのに "\n" を使用することができます。(より長い文字列が必要な場合、連結演算子を使用してください)。
- 手続きの呼び出しまたは実行するファイル
- 括弧に囲まれた式
- (カンマで区切られた) 式の列を角括弧に入れたもの。例えば、`[1, 2, 3, 5, 8]` のように。配列の作成に使用されます。

以下の 3 種類のコメント形式がサポートされています:

- 文字“#”から行末まで
- “//”から行末まで
- “/*”から“*/”まで

式は C とほぼ同じですが、二、三の演算子は省かれ、二、三がシェルスクリプトから追加されています。演算子の優先順位はわずかに単純化されています。 その結果、演算子 (とそれらの優先順位) は以下のようになっています:

- 単項演算子 (+, -, !, ~, ++ (前置および後置), -- (前置および後置), () (手続き呼び出し), [] (配列インデックス), :h, :t, :r, :e
  これらの殆んどは、C と同じ意味です。最後の 4 個はシェルスクリプトから借りてきた物で、数式に以下のように適用されます。
  - :h は、パス指定の先頭部分 (ディレクトリ) を返します。
  - :t は、パス指定の末尾 (ファイル名) を返します。
  - :r は、パス指定から拡張子 (があれば) を取り除いたものを返します。
  - :e は、拡張子を返します。
- *, /, % (二項乗法演算子)
- +, - (二項算術演算子)
  + の最初の引数が文字列ならば、+ は加算ではなく文字列連結として働きます。2 番目の文字列が数なら文字列 (10 進表記) に変換されてから結合されます。
- ==, !=, >, <, >=, <= (比較演算子。2 個の整数または 2 個の文字列に適用できます)
- &&, & (論理的 AND とビット毎の AND。(論理的 AND は、短絡評価を行います))
- ||, |, ^ (論理的 OR とビット毎の OR, 排他的論理 OR。(論理的 OR は、短絡評価を行います))
- =, +=, -=, *=, /=, %= (C と同様の代入演算子。最初の引数が文字列である場合、+= は文字列を結合します)

カンマ演算子、"?:" 演算子が存在しないことに注意してください。 “AND”,“OR”と、代入演算子の優先順位は単純化されています。

手続き呼び出しは名前トークンまたは文字列に対して適用することができます。 名前または文字列が FontForge の内部手続きのどれかと認識された場合、それが実行されます。それ以外の場合は実行するファイルの名前であると見なされ、そのファイルが呼び出されます (ファイル名には、トークンとして使用できない文字を含むことができるため、ファイル名を指定するために文字列一般を指定できるのは肝要です)。 手続き名がディレクトリを含まない場合、現在のスクリプトファイルと同じディレクトリにある物と見なされます。手続きに渡すことのできる引数は最大で 25 個です。

配列は参照渡しされます。文字列と整数は値渡しされます。

変数は、値を代入することによって (“=”のみで) 作成することができます。 ですから
`i=3`
によって、“i”の変数定義を行うことができます。変数のスコープは現在のファイルのみに限定されているので、呼び出された手続きには引き継がれません。

文は以下のいずれかをとることができます。

- 1 個の式
- `if ( 式 )
  文の並び
  {elseif ( 式 )
  文の並び}
  [else
  文の並び]
  endif`
- `while ( 式 )
  文の並び
  endloop`
- `foreach
  文の並び
  endloop`
- `return [ 式 ]`
- `shift`

C と同様に、非ゼロとなる式は真であると定義されています。
return 文は、その後ろに返り値 (式) を指定するか、または手続きは何も値を返さずに return で終了することも可能です。
shift 文はシェルスクリプトから拝借した構文で、全ての引数を 1 個ずつシフトします。 (引数 0 のスクリプトファイル名は変更されません。)
foreach 文は、カレントフォントが存在する時のみ使用できます。 foreach 文は、選択したグリフ群に含まれる各グリフに対して 1 回ずつ実行されます。 文の内部では、一度に 1 個のグリフのみが選択されます。 実行が完了すると、最初に選択されていたグリフ群が元通りに戻されます。 (警告: foreach 文の内部でフォントのコード変換を行ってはいけません)。
文は改行 (改行の前にバックスラッシュを置くことによって、長い行を分割することができます) またはセミコロンで完結します。

つまらない例:

>     i=0;	# このセミコロンは不要ですが、あっても構いません
>     while ( i<3 )
>        if ( i==1 /* 無意味なコメント */ )
>     	Print( "Got to one" )	// もう一つコメント
>        endif
>        ++i
>     endloop

FontForge には「カレントフォント」という概念があります――ほぼ全てのコマンドはカレントフォントのみを参照します (ですから、カレントフォントが定義されている必要があります)。 `ファイル(F)`→`スクリプトを実行(X)...` でスクリプトを起動した場合、現在編集中のフォントがカレントフォントとなり、そうでなければ初期状態ではカレントフォントは存在しません。 カレントフォントを変更するには Open() と New(), Close() の各コマンドを使います。 FontForge は、現在開かれたフォントのリストも保持しています。 このリストの並び順にはとくに意味はありません。 リスト内の最初のフォントは $firstfont です。

同様に、CID キー指定フォントを操作する時には、FontForge の操作対象は「現在のサブフォント」であり、ほとんどのコマンドはそのフォントを参照します。それを変更するのには CIDChageSubFont() を使うことができます。

全ての組込み変数 は“$”で始まるので、自分で新しく“$”で始まる変数を作ることはできません (既存の変数 (の一部) に値を代入することはできますが)。

- `$0` 現在実行中のスクリプトファイルの名前
- `$1` スクリプトファイルに渡された最初の引数
- `$2` スクリプトファイルに渡された 2 番目の引数
- ...
- `$argc` スクリプトファイルに渡された引数の個数 ($0 は常に存在するので、 最小値は 1 となります)
- `$argv` により、全ての引数を配列としてアクセスすることができます
- `$curfont` カレントフォントが含まれているファイルの名前
- `$firstfont` フォントリスト (Open() により作成可能です) の最初に位置するフォントのファイル名。 フォントを読み込んでいなければ、この値は空文字列となります。 この値によって、FontForge がフォントを読み込み済みかどうかを判別できます。
- `$nextfont` リスト内でカレントフォントの次に位置するファイルの名前。 (カレントフォントがリストの最後である場合は、空文字列)
- `$fontchanged` カレントフォントが変更されていれば 1, フォントを読み込んでから (または保存してから) 変更が無ければ 0。
- `$fontname` postscript の FontName フィールドに含まれる名前
- `$familyname` postscript の FamilyName フィールドに含まれる名前
- `$fullname` postscript の FullName フィールドに含まれる名前
- `$fondname` これがセットされている場合、カレントフォントを `Macファミリーを出力(F)` で出力したときの FOND の名前
- `$weight` postscript の Weight フィールドに含まれる名前
- `$copyright` postscript の Notice フィールドに含まれる名前
- `$filename` フォントが含まれるファイルの名前
- `$fontversion` フォントのバージョンを示す文字列
- `$cidfontname` はトップレベルの CID-Keyed フォントの名前 (存在しない場合は空文字列) を返します。
  フォントが CID-Keyed フォントであるの判別に利用できます。
- `$cidfamilyname, $cidfullname, $cidweight, $cidcopyright` 上記の各項目と同様です。
- `$mmcount` マルチプルマスターフォントに含まれるインスタンスの個数 (マルチプルマスターフォントでない場合は 0)
- `$italicangle` PostScript の italic angle フィールドの値
- `$curcid` カレントフォントのフォント名を返します。
- `$firstcid` 現在の CID フォントに含まれる最初のフォントの名前を返します。
- `$nextcid` 現在の CID フォントに含まれる次のフォントの名前 (現在のサブフォントが最後の 1 個である場合は空文字列) を返します
- `$macstyle` MacStyle フィールド (フォントがボールド・イタリック・コンデンスト等であるかどうかを示すビットの集まり) を返します。
- `$bitmaps` このフォントにおいて作成されたビットマップのピクセルサイズを全て含む配列を返します (フォントデータベースにグレイマップが含まれる場合、その値は `(<BitmapDepth><<16)|<PixelSize>` という配列で表されます)。
- `$em` はフォントが使用する em ユニットの大きさを返します。
- `$ascent` はフォントの高さを返します。
- `$descent` はフォントの深さを返します。
- `$selection` カレントフォントの各グリフが 1 項目に対応し、そのグリフが選択されているか否か (0=>非選択, 1=>選択)を示す配列を返します。
- `$panose` カレントフォントの 10 要素の panose 値を含む配列を返します。
- `$trace` この値が (訳註: 非 0 に) セットされていると、FontForge は、手続きを呼び出すごとにトレース表示を行います。
- `$version` 現在実行中の FontForge のバージョンを含む文字列を返します。 この値は“20050817”のような書式です。
- `$`<環境設定項目> (例えば `$AutoHint`) により、その環境設定項目に対応する値を調べることができます (値の設定には `SetPref` を使用してください)

以下の例では、読み込み済みの全フォントに対して同じ操作を実行します。

>     file = $firstfont
>     while ( file != "" )
>        Open(file)
>        /* 操作を実行 */
>        file = $nextfont
>     endloop

組込み 手続き の動作は、同じ名前のメニュー項目とほとんど同じです。ここでの説明はしばしば概要しか示されていませんので、より詳しい情報は当該のメニュー項目を調べてください。

- 組込み手続きのアルファベット順一覧
- フォントを必要としない組込み手続き
- `ファイル(F)`メニュー
- ファイル操作
- `編集(E)`メニュー
- `選択(S)`サブメニュー
- `エレメント(L)`メニュー
- フォント情報
- グリフ情報
- 高度組版機能
- `エンコーディング(N)`メニュー
- `ヒント(H)`メニュー
- `メトリック(M)`メニュー
- マルチプルマスター
- CID キー指定フォント
- ユーザとのやりとり
- 環境設定
- 数学関数
- Unicode
- 文字列操作
- 配列
- その他
- 廃止された名前

組込み手続きのアルファベット順一覧

- A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z -

### フォントを読み込む必要がない組込み手続き

- Array(size)
- AskUser(question[,default-answer])
- ATan2(val1,val2)
- Ceil(real)
- Chr(int)
- Cos(val)
- Floor(real)
- Error(str)
- Exp(val)
- DefaultOtherSubrs()
- FileAccess(filename[,prot])
- FontsInFile(filename)
- GetEnv(str)
- GetPref(str)
- Int(real)
- IsFinite(real)
- IsNan(real)
- LoadEncodingFile(filename)
- LoadNamelist(filename)
- LoadNamelistDir([directory-name])
- LoadPlugin(filename)
- LoadPluginDir([directory-name])
- LoadPrefs()
- LoadStringFromFile("filename")
- Log(val)
- New()
- Open(filename[,flags])
- Ord(string[,pos])
- PostNotice(str)
- Pow(val1,val2)
- Print(arg1,arg2,arg3,...)
- Rand()
- ReadOtherSubrsFile(filename)
- Real(int)
- Round(real)
- SavePrefs()
- SetPref(str,val[,val2])
- SizeOf(arr)
- Sin(val)
- Sqrt(val)
- Strcasestr(haystack,needle)
- Strcasecmp(str1,str2)
- Strlen(str)
- Strrstr(haystack,needle)
- Strskipint(str[,base])
- Strstr(haystack,needle)
- Strsub(str,start[,end])
- Strtod(str)
- Strtol(str[,base])
- Tan(val)
- ToString(arg)
- TypeOf(any)
- UCodePoint(int)
- UnicodeFromName(name)
- Utf8(int)
- WriteStringToFile("string","Filename"[,append])

### `ファイル(F)`メニューと同じようにふるまう組込み手続き

- Close()
- ControlAfmLigatureOutput(script,lang,ligature-tag-list)
- Export(format[,bitmap-size])
- FontsInFile(filename)
- Generate(filename[,bitmaptype[,fmflags[,res[,mult-sfd-file[,namelist-name]]]]])
- GenerateFamily(filename,bitmaptype,fmflags,array-of-font-filenames)
- Import(filename[,toback[,flags]])
- MergeKern(filename)
- New()
- Open(filename[,flags])
- PrintFont(type[,pointsize[,sample-text/filename[,output-file]]])
- PrintSetup(type,[printer[,width,height]])
- Quit(status)
- Save([filename])

### ファイル操作

- FileAccess(filename[,prot])
- LoadStringFromFile("filename")
- WriteStringToFile("string","Filename"[,append])

### `編集(E)`メニューのようにふるまう組込み手続き

- Clear
- ClearBackground
- Copy
- CopyFgToBd
- CopyGlyphFeatures(arg,...)
- CopyLBearing
- CopyRBearing
- CopyReference
- CopyVWidth
- CopyWidth
- Cut
- Join([fudge])
- Paste
- PasteInto
- PasteWithOffset(xoff,yoff)
- ReplaceWithReference([fudge])
- SameGlyphAs
- UnlinkReference

### `選択(S)`サブメニューのようにふるまう組込み手続き

- Select(arg1, arg2, ...)
- SelectAll
- SelectAllInstancesOf(name1[,...])
- SelectBitmap(size)
- SelectByATT(type,tags,contents,search-type)
- SelectChanged([merge])
- SelectFewer(arg1, arg2, ...)
- SelectFewerSingletons(arg1, ...)
- SelectHintingNeeded([merge])
- SelectIf(arg1,arg2, ...)
- SelectInvert()
- SelectMore(arg1, arg2, ...)
- SelectMoreSingletons(arg1, ...)
- SelectNone()
- SelectSingletons(arg1, ...)
- SelectWorthOutputting()

### `エレメント(L)`メニューのようにふるまう組込み手続き

- AddAccent(accent[,pos])
- AddExtrema()
- ApplySubstitution(script,lang,tag)
- AutoTrace()
- BitmapsAvail(sizes)
- BitmapsRegen(sizes)
- BuildAccented()
- BuildComposite()
- BuildDuplicate()
- CanonicalContours()
- CanonicalStart()
- CompareFonts(other-font-filename,output-filename,flags)
- CompareGlyphs([pt_err[,spline_err[,pixel_off_frac[,bb_err[,compare_hints[,report_diffs_as_errors]]]]]])
- CorrectDirection([unlinkrefs])
- DefaultRoundToGrid()
- DefaultUseMyMetrics()
- ExpandStroke(width)
- FindIntersections()
- HFlip([about-x])
- Inline(width,gap)
- InterpolateFonts(percentage,other-font-name[,flags])
- MergeFonts(other-font-name[,flags])
- Move(delta-x,delta-y)
- MoveReference(delta-x,delta-y,[refname/ref-unicode]+)
- NearlyHvCps([error[,err-denom]])
- NearlyHvLines([error[,err-denom]])
- NearlyLines(error)
- NonLinearTransform(x-expression,y-expression)
- Outline(width)
- OverlapIntersect()
- PositionReference(x,y,[refname/ref-unicode]+)
- RemoveOverlap()
- Rotate(angle[,ox,oy])
- RoundToCluster([within[,max]])
- RoundToInt([factor])
- Scale(factor[,yfactor][,ox,oy])
- ScaleToEm(em-size)
- Shadow(angle,outline-width,shadow-width)
- Simplify()
- Skew(angle[,ox,oy])
- Transform(t1,t2,t3,t4,t5,t6)
- VFlip([about-y])
- Wireframe(angle,outline-width,shadow-width)

### フォント情報

- ChangePrivateEntry(key,val)
- ClearPrivateEntry(key)
- GetFontBoundingBox()
- GetMaxpValue(field-name)
- GetOS2Value(field-name)
- GetPrivateEntry(key)
- GetTeXParam(index)
- GetTTFName(lang,nameid)
- HasPrivateEntry(key)
- ScaleToEm(em-size)
- SetFondName(fondname)
- SetFontHasVerticalMetrics(flag)
- SetFontNames(fontname[,family[,fullname[,weight[,copyright-notice[,fontversion]]]]])
- SetFontOrder(order)
- SetItalicAngle(angle[,denom])
- SetMacStyle(val)
- SetMaxpValue(field-name,value)
- SetOS2Value(field-name,field-value)
- SetPanose(array) SetPanose(index,value)
- SetTeXParams(type,design-size,slant,space,stretch,shrink,xheight,quad,extraspace[...])
- SetTTFName(lang,nameid,utf8-string)
- SetUniqueID(value)
- Some items (such as the font name) may be retrieved via built-in variables.

### グリフ情報

- DrawsSomething([arg])
- GetPosSub(feature-tag,script,lang)
- GlyphInfo(str)
- SetCharColor(color)
- SetGlyphComment(comment)
- SetGlyphName(name[,set-from-name-flag])
- SetGlyphChanged(flag)
- SetGlyphClass(class-name)
- SetUnicodeValue(uni[,set-from-value-flag])
- SetGlyphTeX(height,depth[,subpos,suppos])
- WorthOutputting([arg])

### 高度組版機能を操作する組込み手続き

- AddAnchorClass(name,type,script-lang,tag,flags,merge-with)
- AddAnchorPoint(name,type,x,y[,lig-index])
- AddATT(type,script-lang,tag,flags,variant)
- ApplySubstitution(script,lang,tag)
- CheckForAnchorClass(name)
- DefaultATT(tag)
- HasPreservedTable(tag)
- LoadTableFromFile(tag,filename)
- GetPosSub(feature-tag,script,lang)
- RemoveATT(type,script-lang,tag)
- RemoveAnchorClass(name)
- RemovePreservedTable(tag)
- SaveTableToFile(tag,filename)

### `エンコーディング(N)`メニューのようにふるまう組込み手続き

- CharCnt()
- DetachGlyphs
- DetachAndRemoveGlyphs
- LoadEncodingFile(filename)
- MultipleEncodingsToReferences()
- Reencode(encoding-name[,force])
- RemoveDetachedGlyphs()
- RenameGlyphs(namelist-name)
- SameGlyphAs
- SetCharCnt(cnt)

### `ヒント(H)`メニューのようにふるまう組込み手続き

- AddHHint(start,width)
- AddInstrs(thingamy,replace,instrs)
- AddVHint(start,width)
- AutoCounter()
- AutoHint()
- AutoInstr()
- ChangePrivateEntry(key,val)
- ClearCharCounterMasks()
- ClearHints()
- ClearInstrs()
- ClearPrivateEntry(key)
- ClearTable(tag)
- DontAutoHint()
- FindOrAddCvtIndex(value[,sign-matters])
- GetCvtAt(index)
- GetPrivateEntry(key)
- HasPrivateEntry(key)
- PrivateToCvt()
- ReplaceCharCounterMasks(array)
- ReplaceCvtAt(index,value)
- SetCharCounterMask(cg,hint-index,hint-index,...)
- SubstitutionPoints()

### `メトリック(M)`メニューのようにふるまう組込み手続き

- AutoKern(spacing,threshold[,kernfile])
- AutoWidth(spacing)
- CenterInWidth()
- SetKern(ch2,offset)
- RemoveAllKerns()
- RemoveAllVKerns()
- SetLBearing(lbearing[,relative])
- SetRBearing(rbearing[,relative])
- SetVKern(ch2,offset)
- SetVWidth(vertical-width[,relative])
- SetWidth(width[,relative])
- VKernFromHKern()

### マルチプルマスター操作ルーチン

- MMAxisBounds(axis)
- MMAxisNames()
- MMBlendToNewFont(weights)
- MMChangeInstance(instance)
- MMChangeWeight(weights)
- MMInstanceNames()
- MMWeightedName()

  ### CID フォント操作ルーチン

- CIDChangeSubFont(new-sub-font-name)
- CIDFlatten()
- CIDFlattenByCMap(cmap-filename)
- CIDSetFontNames(fontname[,family[,fullname[,weight[,copyright-notice]]]])
- ConvertToCID(registry, ordering, supplement)
- ConvertByCMap(cmapfilename)

  ### ユーザとのやりとり

  - AskUser(question[,default-answer])
  - Error(str)
  - PostNotice(str)
  - Print(arg1,arg2,arg3,...)

  ### 環境設定

  - DefaultOtherSubrs()
  - GetPref(str)
  - LoadEncodingFile(filename)
  - LoadNamelist(filename)
  - LoadNamelistDir([directory-name])
  - LoadPlugin(filename)
  - LoadPluginDir([directory-name])
  - LoadPrefs()
  - ReadOtherSubrsFile(filename)
  - SavePrefs()
  - SetPref(str,val[,val2])
  - 環境設定項目の値は、項目名の前にドル記号 ($) をつけた名前の変数によって得ることもできます。

  ### 数学関数

  - ATan2(val1,val2)
  - Ceil(real)
  - Chr(int)
  - Cos(val)
  - Exp(val)
  - Floor(real)
  - Int(real)
  - IsFinite(real)
  - IsNan(real)
  - Log(val)
  - Ord(string[,pos])
  - Pow(val1,val2)
  - Rand()
  - Real(int)
  - Round(real)
  - Sin(val)
  - Sqrt(val)
  - Strskipint(str[,base])
  - Strtod(str)
  - Strtol(str[,base])
  - Tan(val)
  - ToString(arg)
  - UCodePoint(int)

  ### Unicode

  - UCodePoint(int)
  - UnicodeFromName(name)
  - Utf8(int)

  ### 文字列操作

  - Chr(int)
  - GetEnv(str)
  - Ord(string[,pos])
  - Strcasecmp(str1,str2)
  - Strcasestr(haystack,needle)
  - Strlen(str)
  - Strrstr(haystack,needle)
  - Strskipint(str[,base])
  - Strstr(haystack,needle)
  - Strsub(str,start[,end])
  - Strtod(str)
  - Strtol(str[,base])
  - ToString(arg)
  - UnicodeFromName(name)
  - Utf8(int)

  ### 配列操作

  - Array(size)
  - SizeOf(arr)

  ### その他

  - InFont(arg)
  - TypeOf(any)

    ### 廃止された名前

    - ClearCharCounterMasks()
    - CharInfo(str)
    - ReplaceCharCounterMasks(array)
    - SetCharColor(color)
    - SetCharComment(comment)
    - SetCharCounterMask(cg,hint-index,hint-index,...)
    - SetCharName(name[,set-from-name-flag])

    ## 例

    - FontForge のテストスイート (という程の物ではないが)
    - 寄贈されたスクリプトのディレクトリ
    - その他のプロジェクトで使用されているスクリプト
      - x-symbol
    - スクリプト処理のチュートリアル

    ### 例 1:

    >     # 選択中のすべてのグリフの色を黄色に設定する。
    >     # FontForge の対話的なセッション中で動かすように作られている。
    >     foreach
    >       SetCharColor(0xffff00)
    >     endloop

    ### 例 2:

    >     #!/usr/local/bin/fontforge
    >     # 2つのフォントを比較する sfddiff スクリプト

    >     if ( Strtol($version)<20060330 )
    >       Error( "FontForge を新しいバージョンに更新してください" )
    >     endif

    >     flags=0x789
    >     outfile=""

    >     while ( $argc > 1 && Strsub($1,0,1)=="-" )
    >       temp = $1
    >       if ( Strsub(temp,1,2)=='-' )
    >         temp = Strsub(temp,1)
    >       endif

    >       if ( temp=="-ignorehints" )
    >         flags = flags & ~0x8
    >       elseif ( temp=="-ignorenames" )
    >         flags = flags & ~0x100
    >       elseif ( temp=="-ignoregpos" )
    >         flags = flags & ~0x200
    >       elseif ( temp=="-ignoregsub" )
    >         flags = flags & ~0x400
    >       elseif ( temp=="-ignorebitmaps" )
    >         flags = flags & ~0x80
    >       elseif ( temp=="-exact" )
    >         flags = flags | 0x2
    >       elseif ( temp=="-warn" )
    >         flags = flags | 0x44
    >       elseif ( temp=="-merge" )
    >         flags = flags | 0x1800
    >         shift
    >         outfile = $1
    >       elseif ( temp=="-help" )
    >         Print( "sfddiff: [--version] [--help] [--usage] [--ignorehints] [--ignorenames] [--ignoregpos] [--ignoregsup] [--ignorebitmaps] [--warn] [--exact] fontfile1 fontfile2" )
    >         Print( " 2つのフォントファイルを比較する." )
    >         Print( " --ignorehints: PostScript ヒントや TrueType 命令を比較しない" )
    >         Print( " --ignorenames: フォント名を比較しない"  )
    >         Print( " --ignoregpos:  カーニング等の指定を比較しない" )
    >         Print( " --ignoregsub:  合字等の指定を比較しない" )
    >         Print( " --ignorebitmaps: ビットマップを比較しない" )
    >         Print( " --exact:       通常は sfddiff は厳密に同一ではないもの両者の違いが微細な" )
    >         Print( "                文字列を一致した物と見なします (そのおかげで、TrueType と" )
    >         Print( "                PostScirpt フォントを比較してまともな答えが得られます)." )
    >         Print( "                また, sfddiff は比較を行う前に参照を展開します (それに" )
    >         Print( "                より, (参照を含まない) PostScript フォントと (参照を含む)" )
    >         Print( "                元データを比較することができます). このフラグを設定した")
    >         Print( "                場合, グリフが一致するかどうかの判定を厳密に行います.")
    >         Print( " --warn:        正確に一致しない物が無いときに, 詳しい情報を出力する" )
    >         Print( " --merge outfile: アウトラインの相異点があるとき, 適切なグリフの背景に" )
    >         Print( "                差分を書き出す" )
    >     return(0)
    >       elseif ( temp=="-version" )
    >         Print( "Version 1.0" )
    >     return(0)
    >       else
    >     break
    >       endif
    >       shift
    >     endloop

    >     if ( $argc!=3 || $1=="--usage" || $1=="-usage" )
    >       Print( "sfddiff: [--version] [--help] [--usage] [--ignorehints] [--ignorenames] [--ignoregpos] [--ignoregsup] [--ignorebitmaps] [--warn] [--exact] [--merge outfile] fontfile1 fontfile2" )
    >     return(0)
    >     endif

    >     Open($2)
    >     Open($1)
    >     CompareFonts($2,"-",flags)
    >     if ( outfile!="" )
    >       Save(outfile)
    >     endif

    ### 例 3:

    >     #!/usr/local/bin/fontforge
    >     # ラテン文字のフォントをとり、キリル文字の追加に先だって、
    >     # いくつかの単純な変形を適用する。
    >     # 非対話的な FontForge のセッションからも実行可能。
    >     Open($1);
    >     Reencode("KOI8-R");
    >     Select(0xa0,0xff);
    >     // ラテン文字と同じと思われるこれらの文字をコピーする
    >     BuildComposit();
    >     BuildAccented();

    >     // "R" を裏返しにしたように見える "Я"(Ya) を処理する
    >     Select("R");
    >     Copy();
    >     Select("afii10049");
    >     Paste();
    >     HFlip();
    >     CorrectDirection();
    >     Copy();
    >     Select(0u044f);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     // "Г"(Gamma) は "L" を上下逆さまにしたように見える
    >     Select("L");
    >     Copy();
    >     Select(0u0413);
    >     Paste();
    >     VFlip();
    >     CorrectDirection();
    >     Copy();
    >     Select(0u0433);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     // 小型大文字の "K" などの編集の準備をする
    >     Select("K");
    >     Copy();
    >     Select(0u043a);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     Select("H");
    >     Copy();
    >     Select(0u043d);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     Select("T");
    >     Copy();
    >     Select(0u0442);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     Select("B");
    >     Copy();
    >     Select(0u0432);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     Select("M");
    >     Copy();
    >     Select(0u043C);
    >     Paste();
    >     CopyFgToBg();
    >     Clear();

    >     Save($1:r+"-koi8-r.sfd");
    >     Quit(0);

    ## 「スクリプトを実行」ダイアログ

    このダイアログにより、FontForge の中でスクリプトを直接打ち込んで実行することができます。 もちろん、一番多いケースは、実行したいスクリプトが既にどこかに存在する場合でしょう。そのために `[呼び出す(A)]` ボタンがダイアログの下についています。 `[呼び出す(A)]` ボタンを押すと、*.pe の拡張子を持つファイルを探すためのファイル選択ダイアログが現れます (ワイルドカードシーケンスを入力して `[フィルタ]` ボタンを押すことにより、これを変更することができます)。 スクリプトを選択すると、そのスクリプトを起動するためのコマンドがダイアログのテキストエリアに挿入されます。

    スクリプトのカレントフォントは、つねにスクリプトの呼び出し元のフォントに設定されます。

    ## スクリプトメニュー

    頻繁に使うスクリプトのリストを、プリファレンスダイアログを用いて作成することができます。`ファイル(F)`→`環境設定(E)...` を起動し、`[スクリプトメニュー]` タブを選択してください。このダイアログには、10 個の入力可能な項目があり、それぞれに名前 (これがメニュー内に表示されます) と、それを指定した時に実行されるスクリプトファイル名の入力欄が含まれています。

    プリファレンスを設定した後、フォントビューからスクリプトを起動することができます。起動には、メニューから直接 (`ファイル(F)`→`スクリプトメニュー`→`(設定した名前)`) 起動するか、ホットキーを使用することができます。 最初に追加したスクリプトは Ctl-Alt-1, 2 番目は Ctl-Alt-2 で起動でき、10 番目は Ctl-Alt-0 となります。

    スクリプト内でのカレントフォントは、常に、それを呼び出したフォントにセットされます。

    ― 前 ― 目次 ― 次 ―